/* 
 * File:   main.cpp
 * Author: Pedro
 *
 * Created on 9 de Agosto de 2010, 08:18
 */

#include <cstdlib>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include "Classe/Arquivo.h"
#include "Classe/Lista.h"
#include "Classe/TabelaHash.h"
#include "Classe/Lexema.h"
#include "funcoes.h"
#include "Sintatico.h"

using namespace std;
using namespace Texto;
/*
 * 
 */
int main(int argc, char** argv)
{   
    Arquivo *arquivo;
 
    for(int i = 1; i < argc; i++){
    //verifica a chamada do programa
    if (argc <= 1)
    {
        cout << "Faltam Argumentos!";
        return 0;
    }
    else
    {

        bool IsErro = false;
        bool IsComentario = false;
   
        arquivo = new Arquivo(argv[i]);

        if(!arquivo->AbrirArquivo())
        {
            cout << "Não foi possível abrir o arquivo: " << argv[i] << "\n";
            continue;
        }
      
        if(argc>2)
        cout << "------Validando arquivo : " << argv[i] << "-------\n";

        //intancia a tabela de simbolos
        TabelaHash *tabelaDeSimbolos = new TabelaHash();

        //preenche a tabela de simbolos
        FuncoesEstaticas::preenchePalavrasReservadas(&tabelaDeSimbolos);

        //abre o arquivo
 

        Lexema *lexema;

        Sintatico *s =  new Sintatico(arquivo);
               
        //le o primeiro lexema
        do{
        s->S();
        lexema = arquivo->RetornaProximoLexema();
        //cout<<(*lexema);
        
         

        //verifica se é comentario

             if((*lexema)=="/*")
                 IsComentario = true;
             else if((*lexema)=="*/")
                 IsComentario = false;

              if(IsComentario || *lexema == "*/")
                continue;

            if(*lexema != "/*" && !lexema->ValidaLexema()){

                cout << "Erro!: linha " << arquivo->getNumLinha() << " : " << (*lexema) << " não reconhecido!\n";
                IsErro = true;
            }else if(!IsComentario)
            {
                Campo insere;

                insere.lexema = *lexema;
                insere.token = lexema->RetornaToken();

                if(!tabelaDeSimbolos->existeNaTabela(insere.lexema) && insere.token != 0)
                    *tabelaDeSimbolos << insere;
            }
         cout<<(*lexema) <<"\n";
         delete lexema;

        } while(!arquivo->fimDoArquivo() && !IsErro);

        //  tabelaDeSimbolos->ExibeTabela();

        //verifica se houve comentario sem termino e exibe mensagem
        if(!IsErro && !IsComentario)
            cout << "Arquivo validado sem erros! \n";
        else if(IsComentario)
            cout << "Comentário não terminado! linha:" << arquivo->getNumLinha() << "\n";

        cout << '\n';
        free(arquivo);
    }
  }
  return 0; 
}

